package com.android.myipc.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Android Studio.
 * User: pengym
 * Date: 2020/11/17
 * Time: 10:14
 * Name: 作用类：view配置
 */
public class viewC {
    //什么是view？

    /**view 是一个控件得抽象，所有得空间都是继承view，控件组LinearLayout
     *
     */
    //view的位置参数
    /**
     * view位置的参数为 top，left bottom right
     * top：左上角纵坐标
     * left：左上角横坐标
     * right：右下角横坐标
     * bottom：右下角纵坐标
     * width = right - left
     * height = bottom - top
     * view源码中对应的参数
     * mLeft = getLeft();
     * mRight = getRight();
     * mTop = getTop();
     * mBottom = getBottom();
     *
     */
    //MotionEvent和TouchSlop
    /**
     * MotionEvent:触摸事件
     * ACTION_DOWN---手指刚接触屏幕
     * ACTION_MOVE --- 手指在屏幕上移动
     * ACTION_UP --- 手机从屏幕上松开的一瞬间
     * 一系列事件
     * 点击屏幕松开后，事件的序列为DOWN->UP
     * 点击屏幕滑动一会再松开，事件的顺序为DOWN->MOVE...>MOVE->UP
     *
     * TouchSlop 系统识别最小的滑动距离
     * 如下获取这个常量 ViewConfiguration.get(getContext()).getScaledTouchSlop();
     * 作用：
     * 处理滑动的时候，用这个常量来过滤，两次滑动事件<常量 ！=滑动
     */
    //VelocityTracker,GestureDetector 和 Scroller

    /**velocityTracker作用：
     * 速度追踪，在 view的onTouchEvent方法中追踪当前点击事件速度
     * VelocityTracker velocityTracker = VelocityTracker.obtain();
     * velocityTracker.addMovement(event)
     * 知道当前滑动速度，可以通过以下环境来获得当前速度
     * velocityTracker.computeCurrentVelocity(1000);
     * int xVelocity = velocityTracker.getXVelocity();
     * int yVelocity = velocityTracker.getYVelocity();
     * 速度 ==（终点位置 - 起点位置）/时间段
     * 同时，不需要使用api的时候，需要对它进行内存回收操作
     * velocityTracker.clear()
     * velocityTracker.recycle()
     * GestureDetector作用：
     * 手势检测，用于辅助检测用户的单击，滑动，长按，双击等等
     * GestureDetector mGestureDetector = new GestureDetector(this);
     * 解决长按屏幕后无法拖动现象
     * mGestureDetector.setIsLongpressEnabled(false);
     * 在监听view的onTouchEvent方法中，添加如下实现
     * boolean consume = mGestureDetector.onTouchEvent(event)
     * return consume
     * 之后，我们可以有选择地实现onGestureListenerh和 OnDoubleTapListener方法
     * 方法名-----------------------描述----------------------所属接口
     * onDown---------手指轻轻触摸屏幕的一瞬间，由一个ACTION_DOWN -- onGestureListener
     * onShowPress---- 手指轻轻触摸屏幕，未松开或者拖动，由1个ACTION_DOWN触发，它和onDown的区别是它没有松开或者拖动装填---OnGestureListenenr
     * onSingleTapUp--- 手指触摸屏幕后松开，伴随着1个MotionEvent.ACTION_UP触发，这是单击行为---onGestureListener
     * onScroll ----- 手指按下屏幕并拖动，由一个ACTION_DOWN，多个ACTION——MOVE触发，这是拖动行为 ---- onGestureListener
     * onLongPress --- 用户长久的按着屏幕不放，即长按 ---onGestureListener
     * onFing ---- 用户按下触摸屏，快速滑动后松开，由一个ACTION_DOWN,多个ACTION_MOVE和1个ACTION_UP触发，这事快速滑动行为 ---onGestureListener
     * onDoubleTap --- 双击，由2次连续单机组成，它不可能和o'nSingleTapConfirmed共存 ---OnDoubleTapListener
     * onSingleTapConfirmed ---严格的单机行为，这只是单击，不是双击中的单次单击 ----OnDoubleTapListener
     * onDoubleTapEvent ---- 标识发生了双击行为，在双击期间，ACTION_DOWN,ACTION_MOVE和ACTION_UP都会触发回调 ---OnDoubleTapListener
     * scroller 作用：
     * 弹性滑动对象
     * 如何使用
     * Scroller scroller = new Scroller(mContext);
     * private void smoothScrollTo(int destX,int destY){
     *     int scrollX = getScrollX();
     *     int delta = destX-scrollX;
     *     mScroller.startScroll(scrollX,0,delta,0,1000);
     *
     * }
     *
     */

    //view的滑动
    /**
     *使用scrollTo/scrollBy
     * ccrollTo实现了基于所有参数的绝对滑动，其中view的内部由两个属性mScrollX sScrollY
     * mScrollX = view的左边缘+view内容左边缘在水平方向的距离
     * mScrollY = view的上边缘和view内容上边缘在竖直方向的距离
     * 2：使用动画
     * translationX
     * translationY
     * 3：改变布局参数
     * 使用MarginLayoutParams
     * 4:各种滑动的对比
     * scrollTo/scrollBy：它只滑动内容，不滑动View本身
     * 动画：androidSDK>3.0，3.0以下不能改变view的属性
     * 改变布局：使用麻烦，无明显缺点，无动画，无优化体验，适用于有交互的view
     *
     */
    //弹性滑动
    /**
     * 1 使用 Scroller
     * 2 通过动画
     * 3 使用延时策略
     */

    //View的事件分发机制
    /**
     * 1:dispatchTounchEvent:用来进行事件分发，如果事件传递给当前View，那么一定调用此方法，返回结果受当前View的onTouchEvent()
     * 和下级的dispatchTounchEvent方法影响，标识是否消耗此次事件
     * 2:onInterceptTounchEvent:用来判断是否拦截本次事件，如果当前View拦截了某个事件，那么在同一个事件序列中，此方法不会再次被调用，返回结果标识是否拦截当前事件
     * 3:onTouchEvent:用来处理点击事件，放回结果标识是否消耗点击事件，如果不消耗，则在同一个事件序列中，当前View无法再次接收到事件
     *
     * 对于一个根布局来说，点击事件产生后viewGroup的dispatchTouchEvent方法，如果onIntercepatchTouchEvent返回true？拦截事件：不拦截此事件-》子view中dispatchTonchEvent方法
     * 子View处理点击事件OnTouchListener != null?onTouch调用 == true？onTouchEvent不调用：onTouchEvent调用：onTouch调用
     * 由此发现View的OnTouchListener优先级》onTouchEvent>onClickListener
     * 点击事件产生的顺序 Activity》Window》View
     * View 的onTouchEvent == false？父容器onTouchEvent调用 == false？再上级onTouchEvent调用：父容器消化点击事件：view消化点击事件
     * 注意：
     * 1，同一事件序列是指从手指接触屏幕的那一刻起，到手指离开屏幕的那一刻结束，这个过程钟产生的一系列事件，以down开始---多个move---UP结束
     * 2，正常情况下一个事件序列只能被一个View拦截且消耗
     * 3，因为一旦一个元素拦截了某次事件，那么同一个事件序列中所有的事件都会交给它处理，因此同一个序列的事件只能由一个元素来处理，但是可以通过onTouchEvent
     * 4，某个View一旦开始i拦截事件，那么一系列的事件都会交给它处理，并且它的onIterceptTouchEvent不会再被调用
     * 5，某个View一旦开始处理事件，如果它不消耗ACTION_DOWN事件，那么同一事件中的其他事件都不会交给它处理，并将事件重新交给父容器处理
     * 6，某个View只消耗ACTION_DOWN事件，那么这个点击事件会消失，父元素的onTouchEvent不会被调用，最后这些点击事件都会被Activity处理
     * 7，viewGroup默认不拦截任何事件
     * 8，view没有onInterceptTouchEvent方法，一旦有事件传给他，那么onTouchEvent方法就会被调用
     * 9，view的onTouchEvent默认会消耗事件，除非他是不可点击得。
     * 10，view 得enable属性不影响onYouchEvent得默认返回值
     * 11，onclick发生得前提是View是可以点击得，并且它收到了down和Up事件
     * 12，事件得传递是由外向内得，即事件总是先传递给父元素，再由父元素分发给子元素
     */
    //3.4.2 事件分发源码解析
    /**
     *
     */

    //4.3 View 的工作流程
    /**
     * view 的工作流程主要分为三块， measure ,layout,draw即测量，布局，绘制
     * measure测量宽高
     * layout确定最终宽/高和四个顶点的位置
     * draw将View 绘制到屏幕上
     *
     */
    //4.4自定义View得分类
    /**
     * 继承View重写onDraw方法
     * 继承viewGroup派生特殊得Layout
     * 继承特定得View（比如textView）
     * 继承特定得ViewGroup（比如LinerLayout）
     *
     */
    //自定义View的需知
    /**
     * 让View支持wrap_content
     * 如果有必要，让你的View支持padding
     * 尽量不要在View中使用Handler，没必要
     * view中如果有线程或者动画，需要及时停止，不然容易发生内存泄漏
     * view带有滑动嵌套情形时，需要处理好滑动冲突
     */
    //之定义View实例
    /**
     * 继承View 重写onDraw方法
     * 重写onDraw，支持wrap_content
     * 处理padding
     */
    //5.1 pendingIntent概述
    /**
     * 和intent区别：
     * pending代表待定，等待，即将发生的意思，主要用于桌面小部件
     *
     */
    //6：Android中的Drawable
    /**
     * 概念：通过颜色构建各式各样的图像效果
     * 分类
     * bitmapDrawable
     */
    //7 view动画
    /**
     * view动画的作用对象是view，支持4种动画效果，分别是平移动画，缩放动画，旋转动画，和透明度动画----还有一种特殊的贞动画
     * TranslateAnimation 平移动画 <translate> 移动view
     * ScaleAnimation   缩放动画 <scale> 放大或缩小view
     * RotateAnimation  旋转动画 <rotate> 旋转view
     * AlphaAnimation   透明度动画 <alpha> 改变view的透明度
     */

}

